package com.util;

import java.io.*;
import java.util.List;
import java.util.ArrayList;

/*
 * Copyright (c) 2006 . All Rights Reserved.
 */

/**
 * 操作文件的一些相关方法，该类不需要实例化，不允许继承。
 *
 * @author 朱有龙
 * @version 1.0
 */
public final class FileUtils {
    /**
     * 该类不需要实例化
     */
    private FileUtils() {
    }

    /**
     * 读入文件到安符串中，本方法是以流的方式来读取。以系统默认的encoding到String<br>
     * --------------------------------------------------------------------------<br>
     * 创建者：朱有龙<br>
     * 创建日期：2004-1-5<br>
     * <br>
     * 修改者：<br>
     * 修改日期：<br>
     * 修改原因：<br>
     * --------------------------------------------------------------------------
     *
     * @param fileFullName 文件名，包括路径
     * @return 文件内容
     * @throws IOException 读取例外。
     */
    public static String fileRead(String fileFullName) throws IOException {
        //---------------------------------
        // 定义返回结果变量
        //---------------------------------
        String result = null;
        InputStream in = null;
        try {
            File file = new File(fileFullName);
            if(!file.exists()){
            	return "";
            }
            long len = file.length();
            if (len > 0) {
                //---------------------------------
                // 如果文件的字节数大于0，打开流
                //---------------------------------
                in = new FileInputStream(file);
                byte[] bytes = new byte[(int) len];
                //---------------------------------
                // 读入全部内容到byte数组中
                //---------------------------------
                in.read(bytes);
                //---------------------------------
                // 把byte数组中的内容转换成String
                //---------------------------------
                result = new String(bytes);
                bytes = null;
            }
        } finally {
            if (in != null) {
                //---------------------------------
                // 如果流不为空，则最后要关闭流。
                //---------------------------------
                try {
                    in.close();
                    in = null;
                } catch (IOException e) {
                    //---------------------------------
                    // 该例外不需要处理。
                    //---------------------------------
                }
            }
        }
        return result;
    }

    /**
     * 将String写入到文件，该方法是以文本形式写得到文件中<br>
     * --------------------------------------------------------------------------<br>
     * 创建者：朱有龙<br>
     * 创建日期：2004-1-5<br>
     * <br>
     * 修改者：<br>
     * 修改日期：<br>
     * 修改原因：<br>
     * --------------------------------------------------------------------------
     *
     * @param fileFullName 文件全名
     * @param fileContent  内容
     * @param append       是否追加
     * @throws IOException 例外
     */
    public static void fileWrite(String fileFullName,
                                 String fileContent,
                                 boolean append) throws IOException {
        FileWriter writer = null;
        try {
            //---------------------------------
            // 获得一个文件写入的句柄
            //---------------------------------
            writer = new FileWriter(fileFullName,append);
            //---------------------------------
            // 写入内容
            //---------------------------------
            writer.write(fileContent);
            //---------------------------------
            // 将内容写到碰盘上
            //---------------------------------
            writer.flush();
        } finally {
            if (writer != null) {
                //---------------------------------
                // 如果句柄不为空。则最后要关闭句柄
                //---------------------------------
                try {
                    writer.close();
                    writer = null;
                } catch (IOException e) {
                }
            }
        }
    }

    /**
     * 将byte数组写入到文件，本方法是以二进制的形式写到碰盘上<br>
     * --------------------------------------------------------------------------<br>
     * 创建者：朱有龙<br>
     * 创建日期：2004-1-5<br>
     * <br>
     * 修改者：<br>
     * 修改日期：<br>
     * 修改原因：<br>
     * --------------------------------------------------------------------------
     *
     * @param fileFullName 文件全名
     * @param fileContent  内容
     * @param append       是否追加
     * @throws IOException 例外
     */
    public static void fileWrite(String fileFullName,
                                 byte[] fileContent,
                                 boolean append) throws IOException {
        FileOutputStream outputStream = null;
        try {
            //---------------------------------
            // 获得一个二进制写入流的句柄
            //---------------------------------
            outputStream = new FileOutputStream(fileFullName,
                    append);
            //---------------------------------
            // 写入内容
            //---------------------------------
            outputStream.write(fileContent);
            //---------------------------------
            // 将内容写到碰盘上
            //---------------------------------
            outputStream.flush();
        } finally {
            if (outputStream != null) {
                //---------------------------------
                // 如果句柄不为空。则最后要关闭句柄
                //---------------------------------
                try {
                    outputStream.close();
                    outputStream = null;
                } catch (Exception e) {
                }
            }
        }
    }

    /**
     * 生成静态文件专用,
     *
     * @param pathName
     * @param fileName
     * @param fileContent
     */
    public static void BuildFile(String pathName, String fileName, String fileContent) {
        StringBuffer sb = new StringBuffer();
        sb.append(fileContent);
        //写文件
        String treepath = pathName + "/" + fileName;
        File file = new File(treepath);
        File parentFile = file.getParentFile();
        if (!parentFile.isDirectory()) {
            parentFile.mkdirs();
        }
        FileWriter filewriter = null;
        
        try {
            filewriter = new FileWriter(treepath);
            filewriter.write(sb.toString());
            filewriter.flush();
        } catch (Exception e) {
            System.err.print(e);
        } finally {
            try {
                filewriter.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            sb.setLength(0);
        }
    }


    /**
     * 文件更名
     * @param srcName 更名源文件     (绝对路径)
     * @param objName 更名后的文件名 (绝对路径)
     * @return
     */
    public static boolean renameFile(String srcName, String objName) {
        boolean result = false;
        try {
            File srcFile = new File(srcName);
            File objFile = new File(objName);
            result = srcFile.renameTo(objFile);
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {

        }
        return result;
    }

    //获取提定目录下的文件列表
    public static List getPathFileList(String path) {
        File file = new File(path);
        File[] fs = file.listFiles();
        List filenameList = new ArrayList();
        for (int i = 0; i < fs.length; i++) {
            filenameList.add(fs[i].getName());
        }
        return filenameList;
    }

    /**
     * 删除单个文件
     * @param path
     */
    public static void delFile(String path){
        File file = new File(path);
        try {
            if(file.exists()){
                file.delete();
            }
        } catch (Exception e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }

     public static String readFileToString(String filepath) {
        String templateContent = "";
//        File templatefile = new File("D:\\newproject\\searchvideo\\resources\\index.html");
        File templatefile = new File(filepath);

        FileInputStream fileinputstream = null;//读取模块文件
        try {
            fileinputstream = new FileInputStream(templatefile);
            byte[] b = new byte[1024*4];
            int i = 0;
  		  
  		  /*原文件utf8编码，转成gbk编码输出xml文件*/
            while((i = fileinputstream.read(b)) > 0)
            {
                //outp.write(b, 0, i);
            	templateContent += new String(b,0,i,"UTF-8");
            }
            
//            
//            int lenght = fileinputstream.available();
//            byte bytes[] = new byte[lenght];
//            fileinputstream.read(bytes);
            fileinputstream.close();
//            templateContent = new String(bytes);
//            System.out.println("templateContent = "+templateContent);
        } catch (FileNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
        return templateContent;
    }
     
     /**
 	 * 删除文件及其子文件
 	 * @param file 
 	 */
 	private static  void delDirect(File file){
 		if(file.exists()){
 			File[] files = file.listFiles();  //子文件集合
 			if(files!=null){
 				if(files.length>=0){
 					for(int i=0;i<files.length;i++){
 						delDirect(files[i]);
 						files[i].delete();
 					}
 				}
 			}
 			file.delete();  //删除根文件夹或文件
 		}
 	}
 	
//    public static void main(String args[]) {
//     FileUtils.renameFile("e://a.txt","e://b.txt");
//    }
}
